// 模块导入
import database from '../../utils/database'
import bcrypt from 'bcrypt'
// 数据库中用户表的表名
const tableName = 'users'
// 定义用户信息接口
export interface UserInfo {
  id: number;
  username: string;
  role: 'normal' | 'admin';
}
// 用户服务类
export class UsersService {
  // 登录方法
  login(username: string, password: string): Promise<UserInfo> {
    return new Promise((res, rej) => {
        // 读取数据库用户数据
        database.queryData(tableName, ['id', 'username', 'role', 'password'], `username = '${username}'`, (data)=>{
            // DB返回的是数组，直接取其中一个即可（只有一个元素）
            let result = data.result.pop();
            // 如果用户数据存在，则进行后续验证
            if (result != null) {
                let p = result.password;
                // 验证密码
                let success = bcrypt.compareSync(password, p);
                if (success) {
                    // 登录成功，返回用户数据
                    database.updateData(tableName, 'last_login_time = NOW()', `id = ${result.id}`)
                    res({
                        id: result.id,
                        username: result.username,
                        role: result.role
                    })
                } else {
                    rej('密码错误，请重新输入')
                }
            } else {
                rej('请输入正确的账户信息')
            }
        })
    });
  }
  // 注册方法
  signUp(username: string, password: string, role: string): Promise<null> {
    return new Promise((res, rej) => {
        // 检查是否已经有用户存在
        database.queryData(tableName, ['id'], `username = '${username}'`, (data)=>{
            let result = data.result.pop();
            // 如果用户已经存在，则不能重复注册
            if (result != null) {
                rej('用户名已存在，请更换其他用户名注册')
            } else {
                // 对密码进行加密
                let crypt = bcrypt.hashSync(password, 10)
                // 将密码加密后的用户数据存储到数据库中
                database.insertData(tableName, ['username', 'password', 'role'], [username, crypt, role], data => {
                    if (data) {
                        res(null)
                    } else {
                        rej('注册失败，请稍后重试')
                    }
                })
            }
        })
    });
  }
}
// 导出服务类
export default new UsersService();
